package com.cty.basic;

import java.io.IOException;

import javax.xml.parsers.ParserConfigurationException;
import javax.xml.parsers.SAXParser;
import javax.xml.parsers.SAXParserFactory;

import org.xml.sax.Attributes;
import org.xml.sax.SAXException;
import org.xml.sax.helpers.DefaultHandler;

/**
 * @Auther: cty
 * @Date: 2020/1/23 18:08
 * @Description:  熟悉SAX解析流程——解析xml文件信息并打印出来
 * @version: 1.0
 */
public class Test02Xml01 {
    public static void main(String[] args) throws ParserConfigurationException, SAXException, IOException {
        //SAX解析
        //1、获取解析工厂
        SAXParserFactory factory=SAXParserFactory.newInstance();
        //2、从解析工厂获取解析器
        SAXParser parse =factory.newSAXParser();
        //3、编写处理器
        //4、注册/实现处理器（即新建一个处理器对象）
        PHandler handler=new PHandler();
        //5、加载文档，解析
        parse.parse(Thread.currentThread().getContextClassLoader()
                        .getResourceAsStream("com/cty/basic/testxml.xml")
                ,handler);

    }
}

// 编写处理器——处理xml文件信息并打印出来
class PHandler extends DefaultHandler{
    @Override
    //（1）文档解析开始
    public void startDocument() throws SAXException {
        System.out.println("----文档解析开始----");
    }

    @Override
    //（2）元素解析开始——qName对应元素名
    public void startElement(String uri, String localName, String qName, Attributes attributes) throws SAXException {
        System.out.println(qName+"-->元素解析开始");
    }

    @Override
    //（3）解析过程
    public void characters(char[] ch, int start, int length) throws SAXException {
        String contents = new String(ch,start,length).trim();
        if(contents.length()>0) {
            System.out.println("内容为->"+contents);
        }else {
            System.out.println("内容为->"+"空");
        }
    }

    @Override
    //（4）元素解析结束
    public void endElement(String uri, String localName, String qName) throws SAXException {
        System.out.println(qName+"-->元素解析结束");
    }

    @Override
    //（5）文档解析结束
    public void endDocument() throws SAXException {
        System.out.println("----文档解析结束----");
    }
}

/* res:
----文档解析开始----
persons-->元素解析开始
内容为->空
person-->元素解析开始
内容为->空
name-->元素解析开始
内容为->至尊宝
name-->元素解析结束
内容为->空
age-->元素解析开始
内容为->9000
age-->元素解析结束
内容为->空
person-->元素解析结束
内容为->空
person-->元素解析开始
内容为->空
name-->元素解析开始
内容为->白晶晶
name-->元素解析结束
内容为->空
age-->元素解析开始
内容为->7000
age-->元素解析结束
内容为->空
person-->元素解析结束
内容为->空
persons-->元素解析结束
----文档解析结束----
*/